package cn.edu.jxau.core.service;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import cn.edu.jxau.core.controller.ServiceResultConfig;
import cn.edu.jxau.core.exception.ServiceException;
import cn.edu.jxau.core.util.DateUtils;
import cn.edu.jxau.core.util.StringUtil;
import cn.edu.jxau.framework.dao.core.Session;
import cn.edu.jxau.framework.dao.core.sqlSessionFactory;

/*
 *@author 作者 :Harold
 *@version 创建时间：2017年8月29日 下午12:50:41
 * 回收站的业务处理
 */
public class RecycleBinService extends ServiceSupport{
	public RecycleBinService(){
		super();
	}
	
	public RecycleBinService(String view, Map<String, Object[]> params, Map<String, Object> data) throws ServiceException {
		/**
         * view service.xml中的name和视图对应
         * params request入口的参数数组
         * data 返回给Servlet的出口参数
         */
		super(view, params, data);
		execute(view, params, data); // 执行业务
	}
	
	
	/**
	 * 查看所有回收站文件
	 * @param params
	 * @return
	 */
	@SuppressWarnings({ "unchecked" })
	private void listAllRecycleBin(Map<String, Object[]> params, Map<String, Object> data){
		Map<String, Object> param_dir = new HashMap<String, Object>(); //用来封装传递给查询我的文件夹对象数据库的参数
        List<HashMap<String, Object>> datas_dir = new ArrayList();  // 用来接收数据库返回回来的 文件夹	        
        List<HashMap<String, Object>> datas_file = new ArrayList();  // 用来接收数据库返回回来的  文件
        Map<String, Object> param_file = new HashMap<String, Object>(); //用来封装传递给查询我的文件对象数据库的参数
        //获得用户的id
        String userID = getParamStringValue(params,"userID",0);  
        //将用户的id传入param_dir，用来查询该id用户的文件夹
        param_dir.put("userID", userID);
        
        //通过数据库获得所有信息
        try {        	
            Session session = sqlSessionFactory.getInstance().getSession(); 
            //得到所有的文件夹
            session.execute("queryUserDir", param_dir, datas_dir);
            //设置只查询划入回收站的文件 
            param_file.put("isDelete", 1);
            //遍历文件夹，并分别得到文件
            for(HashMap<String, Object> dir : datas_dir){    
            	//根据typeid选择不同的查询文件
            	if((int)dir.get("typeID") == 1){
            		param_file.put("fileID", dir.get("id"));
            		session.execute("queryAlgorithmFile", param_file, datas_file);
            	}
            	else if((int)dir.get("typeID") == 0){
            		param_file.put("fileID", dir.get("id"));
            		session.execute("querySpectrumFile", param_file, datas_file);
            	}
            	else{
            		System.out.println("error");
            	}           	
            }
                   
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //用来比较日期时间
            Long month = Long.parseLong("2592000000");				//存放30天的毫秒数
        	long date = df.parse(DateUtils.getNowTime()).getTime() - month;		//30天前的时间
        	
        	long filedate = 0;
        	String table = null;
        	Object id = null;
        	long diff = 0;
        	
            //遍历所有文件,根据每个文件的日期判断是否需要删除
            for(HashMap<String, Object> file : datas_file){ 
            	if(file.get("algorithmUploadtime") != null){
            		filedate = ((Date)file.get("algorithmUploadtime")).getTime();
            		table = "algorithm";
            		id = file.get("id");            		
            	}
            	else if(file.get("saveTime") != null){
            		filedate = ((Date)file.get("saveTime")).getTime();
            		table = "spectrum";
            		id =  file.get("Id");
            	}
            	
            	diff = filedate - date;
            	if(diff <= 0){
            		deleteFile(table, id);
            		file.put("isDelete", 2);
            	}
            }
            
        	// 成功返回success
        	data.put("result", ServiceResultConfig.SUCCESS);  
            //将数据封装进去
            data.put("recyclebin", datas_file);
           
            //释放会话
            session.releaseConnection();
        } catch (Exception e) {
        	e.printStackTrace();
        }
        
	}
	
	/**
	 * 修改回收站文件的状态
	 * @param params 传入的参数
	 * @param data 返回的数据
	 */
	private void updateRecycleBinStatus(Map<String, Object[]> params, Map<String, Object> data){
		Map<String, Object> param = new HashMap<String, Object>(); //用来封装传递给查询我的文件夹对象数据库的参数
        List<HashMap<String, Object>> datas = new ArrayList();  // 用来接收数据库返回回来的 文件夹	
        
        //获取操作类别
        String handle = getParamStringValue(params,"handle",0);         
        
        String fileid = null;   //文件id
        String tablename = null;  //文件所属的表
        Integer status = null;  //修改后的和状态
        
        //获取删除文件夹的参数     
        if(handle.equals("delete")){
        	fileid = getParamStringValue(params,"id",0); 
        	tablename =  getParamStringValue(params,"table",0); 
        	status = 2;
        }
        //获取恢复文件夹的参数
        if(handle.equals("recover")){
        	fileid = getParamStringValue(params,"id1",0); 
        	tablename =  getParamStringValue(params,"table1",0); 
        	status = 0;
	    }
        
        //将得到的参数封装到参数map中
        param.put("fileid", fileid);
        param.put("isDelete", status);    
        
        try {        	
            Session session = sqlSessionFactory.getInstance().getSession(); 
            if(tablename.equals("algorithm")){
            	//得到所有的文件夹
                session.execute("updateAlgorithmFile", param, datas);
                // 成功返回success
                data.put("result", ServiceResultConfig.SUCCESS);  
            }
            if(tablename.equals("spectrum")){
            	//得到所有的文件夹
                session.execute("updateSpectrumFile", param, datas);
                data.put("result", ServiceResultConfig.SUCCESS);  
            }            
        }catch (Exception e) {
        	data.put("result", ServiceResultConfig.SUCCESS);
        	System.out.println("error");
        }
	}
	
	
	/**
	 * 根据传入的表名和id,删除文件
	 * @param tablename 需要访问的表明
	 * @param id 需要访问的表内文件的id
	 * @return
	 */
	private String deleteFile(String tablename, Object id){
		Map<String, Object> param = new HashMap<String, Object>(); //用来封装传递给查询我的文件夹对象数据库的参数
        List<HashMap<String, Object>> datas = new ArrayList();  // 用来接收数据库返回回来的 文件夹	
        
        //将需要传入的参数传入到param中
        param.put("fileid", id); //表中id字段
        param.put("isDelete", 2);   //修改后的状态字段
		try {        	
            Session session = sqlSessionFactory.getInstance().getSession(); 
            //根据表名操作不同的表
            if(tablename.equals("algorithm")){          	
                session.execute("updateAlgorithmFile", param, datas);
                
            }
            if(tablename.equals("spectrum")){
            	//得到所有的文件夹
                session.execute("updateSpectrumFile", param, datas);
                
            }            
        }catch (Exception e) {
        	return "error";
        }
		return "success";
	}
}


